import { IsNotEmpty, Length, IsString, IsNumber, Min, Max, IsArray, ArrayMinSize, ArrayMaxSize, IsOptional, isNumber, MaxLength, IsBoolean } from 'class-validator';
import PaginationDto from 'src/dto/pagination.dto';
import { ChargeStrategy } from 'src/entities/ChargeStrategy';

class Common extends ChargeStrategy{
    @Length(1, 15, {message : '策略名称限制在1至15个字符之间'})
    @IsString({
        message : '请填写合适的策略名称'
    })
    @IsNotEmpty({
        each : true,
        message : '请填写策略名称'
    })
    strategyName:string;
    

    @Max(100, {message : '单价不能大于100'})
    @Min(0, {message : '单价不能小于0'})
    @IsNumber({allowNaN : false}, {message : '请填写正确的单价'})
    @IsNotEmpty({
        each : true,
        message : '请填写策略单价'
    })
    unitPrice:string;

    @Max(2000, {message : '结算单位不能大于2000'})
    @Min(0, {message : '结算单位不能小于0'})
    @IsNumber({allowNaN : false}, {message : '请填写正确的结算单位'})
    @IsNotEmpty({
        each : true,
        message : '请填写结算单位'
    })
    settleUnit:number;

    // @Max(2000, {message : '最大功率不能大于5000'})
    // @Min(0, {message : '最大功率不能小于0'})
    // @IsNumber({allowNaN : false}, {message : '请填写正确的最大功率'})
    // @IsNotEmpty({
    //     each : true,
    //     message : '请填写最大功率'
    // })
    // maxPower:number;

    // @Max(2000, {message : '最小功率不能大于5000'})
    // @Min(0, {message : '最小功率不能小于0'})
    // @IsNumber({allowNaN : false}, {message : '请填写正确的最小功率'})
    // @IsNotEmpty({
    //     each : true,
    //     message : '请填写最小功率'
    // })
    // minPower:number;

    @Max(2000, {message : '刷卡预付费不能大于1000'})
    @Min(0, {message : '刷卡预付费不能小于0'})
    @IsNumber({allowNaN : false}, {message : '请填写正确的刷卡预付费金额'})
    @IsNotEmpty({
        each : true,
        message : '请填写刷卡预付费金额'
    })
    cardChargeAmount:string;

    @Max(5000, {message : '免费占位时长数据错误'})
    @Min(0, {message : '免费占位时长数据错误'})
    @IsNumber({}, {message : '免费占位时长数据错误'})
    @IsOptional()
    freeOccupyTime:number;

    @Max(100, {message : '占位收费不能大于100'})
    @Min(0, {message : '占位收费不能小于0'})
    @IsNumber({allowNaN : false}, {message : '占位收费数据错误'})
    @IsOptional()
    occupyPrice:string;


    @IsBoolean({message : '充满自停数据错误'})
    @IsOptional()
    fullStop:boolean;

    @IsBoolean({message : '应急充电使能数据错误'})
    @IsOptional()
    emergCharge:boolean;

    @Max(10, {message : '应急充电次数数据错误'})
    @Min(0, {message : '应急充电次数数据错误'})
    @IsNumber({}, {message : '应急充电次数数据错误'})
    @IsOptional()
    emergCount:number;

    @Max(200, {message : '应急充电电能数据错误'})
    @Min(0, {message : '应急充电电能数据错误'})
    @IsNumber({}, {message : '应急充电电能数据错误'})
    @IsOptional()
    emergEnergy:number;

    @Max(255, {message : '充满临界功率数据错误'})
    @Min(0, {message : '充满临界功率数据错误'})
    @IsNumber({}, {message : '充满临界功率数据错误'})
    @IsOptional()
    fullPower:number;

    @Max(255, {message : '判满延时数据错误'})
    @Min(0, {message : '判满延时数据错误'})
    @IsNumber({}, {message : '判满延时数据错误'})
    @IsOptional()
    fullDelay:number;

    @Max(255, {message : '拔掉停止延时数据错误'})
    @Min(0, {message : '拔掉停止延时据错误'})
    @IsNumber({}, {message : '拔掉停止延时数据错误'})
    @IsOptional()
    plugOffDly:number;


    @MaxLength(200, {message : '备注不能超过200个字符'})
    @IsOptional()
    remark:string;

    @ArrayMaxSize(4, {
        message : '预设选项最多设置4个'
    })
    @ArrayMinSize(1, {
        message : '预设选项最最少设置1个'
    })
    @IsArray({
        message : '策略规则非法'
    })
    rules:any[];

    @ArrayMaxSize(10, {
        message : '预设选项最多设置10个'
    })
    @IsArray({
        message : '预设选项非法'
    })
    options:number[];
}


export class AddDto extends Common {
    @IsNumber()
    @IsNotEmpty({
        message : '请选择策略类型'
    })
    strategyType:number;
}

export class EditDto extends Common {
    
}


export default class ListDto extends PaginationDto {
    @IsString()
    @IsOptional()
    strategyName:string;
}